From 0a4950b8c4e83b0bb892ee2eda2437e14415163d Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Fri, 11 Jul 2025 09:34:03 +0200 Subject: [PATCH] fix: do not recurse inside a remote folder when etag did not change we do not want to remote discover a folder just because the permissions are modified but not the etag for any valid case, etag must change Signed-off-by: Matthieu Gallien --- src/libsync/discovery.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 5d2ab48e4..c95af63c7 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -1063,6 +1063,9 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(const SyncFileItemPtr &it _discoveryData->findAndCancelDeletedJob(originalPath); postProcessRename(path); + if (item->isDirectory() && serverEntry.isValid() && dbEntry.isValid() && serverEntry.etag == dbEntry._etag && serverEntry.remotePerm != dbEntry._remotePerm) { + _queryServer = ParentNotChanged; + } processFileFinalize(item, path, item->isDirectory(), item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist, _queryServer); }); job->start(); @@ -1167,6 +1170,9 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( item->isPermissionsInvalid = localEntry.isPermissionsInvalid; auto recurseQueryLocal = _queryLocal == ParentNotChanged ? ParentNotChanged : localEntry.isDirectory || item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist; + if (item->isDirectory() && serverEntry.isValid() && dbEntry.isValid() && serverEntry.etag == dbEntry._etag && serverEntry.remotePerm != dbEntry._remotePerm) { + recurseQueryServer = ParentNotChanged; + } processFileFinalize(item, path, recurse, recurseQueryLocal, recurseQueryServer); }; @@ -1587,6 +1593,9 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( processRename(path); recurseQueryServer = etag.get() == base._etag ? ParentNotChanged : NormalQuery; } + if (item->isDirectory() && serverEntry.isValid() && dbEntry.isValid() && serverEntry.etag == dbEntry._etag && serverEntry.remotePerm != dbEntry._remotePerm) { + recurseQueryServer = ParentNotChanged; + } processFileFinalize(item, path, item->isDirectory(), NormalQuery, recurseQueryServer); _pendingAsyncJobs--; QTimer::singleShot(0, _discoveryData, &DiscoveryPhase::scheduleMoreJobs); -- 2.30.2